#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QFile>
#include <QJsonDocument>
#include <QJsonParseError>
#include <QJsonObject>
#include <QJsonValue>
#include <QJsonArray>
#include <QPushButton>
#include <unistd.h>
#include <QTimer>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->resize(800,600);


    this->tcp = new QTcpServer(this);
    this->tcp->listen(QHostAddress::Any,45000);

    //获取服务器发来的信息
    connect(tcp,&QTcpServer::newConnection,this,[&](){
       QTcpSocket* new_node = tcp->nextPendingConnection();

       connect(new_node,&QTcpSocket::readyRead,this,[&](){
           QTcpSocket* read_socket = (QTcpSocket*)sender();

           QString ret =  read_socket->readAll();
            ui->textBrowser->append(ret);
       });
    });


    QPushButton* btn = new QPushButton(this);
    btn->setText("recognize");
    btn->setGeometry(700,0,80,60);
    connect(btn, &QPushButton::clicked,this,&MainWindow::btn );


    // 创建一个垂直布局管理器，将其设置为当前窗口的布局
    QVBoxLayout* layout = new QVBoxLayout(this);

    // 创建一个摄像头取景器（用于显示摄像头画面）
    viewfinder = new QCameraViewfinder(this);
    viewfinder->setFixedSize(400, 380); // 设置取景器的固定大小为 400x280 像素
    layout->addWidget(viewfinder); // 将取景器添加到布局中

    // 设置窗口的布局
    this->setLayout(layout);

    // 检查是否有可用的摄像头
    if (QCameraInfo::availableCameras().isEmpty()) {
        qWarning("No available camera."); // 输出警告信息，表示没有可用的摄像头
        return; // 如果没有可用摄像头，返回并结束函数
    }

    // 创建一个摄像头对象，使用默认的摄像头
    camera = new QCamera(QCameraInfo::defaultCamera(), this);
    camera->setViewfinder(viewfinder); // 将摄像头的取景器设置为之前创建的 viewfinder

    // 创建一个图像捕捉对象，以便从摄像头捕捉图像
    imageCapture = new QCameraImageCapture(camera, this);

    // 连接图像捕捉信号，捕获图像后调用 onImageCaptured 函数
    connect(imageCapture, &QCameraImageCapture::imageCaptured, this, &MainWindow::onImageCaptured);

    // 启动摄像头
    camera->start();

    QTimer *timer = new QTimer;
    connect(timer,&QTimer::timeout,this,&MainWindow::btn);
    timer->start(2000);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::btn()
{
    // 捕获图像
    imageCapture->capture();

}


void MainWindow::onImageCaptured(int id, const QImage &preview) {
    QImage resizedImage = preview.scaled(400, 280, Qt::KeepAspectRatio, Qt::SmoothTransformation);
    // 保存调整后的图像
    QString filePath = "../1.jpg"; // 设置保存的文件名和路径,保存在本地
    if (resizedImage.save(filePath)) {
        qDebug() << "Image saved successfully to" << filePath;
        startFileSending(filePath, "192.168.138.255", 50000);
    } else {
        qDebug() << "Failed to save image.";
    }
}

void MainWindow::startFileSending(const QString &filePath, const QString &ipAddress, quint16 port) {
    // 创建新的线程用于发送文件
    fileSenderThread = new QThread;

    // 创建 FileSender 对象，指定要发送的文件名和目标 IP 地址及端口
    fileSender = new FileSender(filePath, ipAddress, port);

    // 将 fileSender 移动到新创建的线程中，以便在该线程中执行
    fileSender->moveToThread(fileSenderThread);

    // 连接信号与槽，当线程启动时调用 fileSender 的 startSending 方法开始发送文件
    connect(fileSenderThread, &QThread::started, fileSender, &FileSender::startSending);

    // 连接信号与槽，当文件发送完成时退出线程
    connect(fileSender, &FileSender::finished, fileSenderThread, &QThread::quit);

    // 连接信号与槽，当文件发送完成时删除 fileSender
    connect(fileSender, &FileSender::finished, fileSender, &FileSender::deleteLater);

    // 连接信号与槽，当线程完成时删除 fileSenderThread
    connect(fileSenderThread, &QThread::finished, fileSenderThread, &QThread::deleteLater);

    // 启动线程
    fileSenderThread->start();
}
